package com.exam.api.common.poster;

import cn.hutool.core.img.ImgUtil;

import java.awt.Image;
import java.awt.Rectangle;
import java.awt.*;
import java.awt.image.BufferedImage;

/**
 * @Author bcheng
 * @Create 2024/1/29 13:25
 * @Description 图片截取工具类
 */
public class ImageCropUtil {

    /**
     * 非原生裁剪并缩放图像。  依赖Hutool工具类
     *
     * @param originalImage 原始图像
     * @param targetWidth   目标宽度。
     * @param targetHeight  目标高度。
     * @return
     */
    public static BufferedImage crop(BufferedImage originalImage, int targetWidth, int targetHeight) {
        // 计算缩放比例
        double scaleX = (double) targetWidth / originalImage.getWidth();
        double scaleY = (double) targetHeight / originalImage.getHeight();
        double scale = Math.max(scaleX, scaleY);

        // 计算缩放后的图片尺寸
        int scaledWidth = (int) (originalImage.getWidth() * scale);
        int scaledHeight = (int) (originalImage.getHeight() * scale);

        Image scaledImage = ImgUtil.scale(originalImage, scaledWidth, scaledHeight);

        // 计算裁剪区域
        int x = (scaledWidth - targetWidth) / 2;
        int y = (scaledHeight - targetHeight) / 2;

        // 裁剪并输出图片 BufferedImage
        Image croppedImage = ImgUtil.cut(scaledImage, new Rectangle(x, y, targetWidth, targetHeight));
        return ImgUtil.toBufferedImage(croppedImage);
    }

    /**
     * 原生裁剪并缩放图像。  未依赖其他工具类
     *
     * @param originalImage 原始图像
     * @param targetWidth   目标宽度。
     * @param targetHeight  目标高度。
     */
    public static BufferedImage nativeCrop(BufferedImage originalImage, int targetWidth, int targetHeight) {

        // 计算缩放比例。选择宽度和高度中较大的一个，以保持图像比例
        double scaleX = (double) targetWidth / originalImage.getWidth();
        double scaleY = (double) targetHeight / originalImage.getHeight();
        double scale = Math.max(scaleX, scaleY);

        // 计算缩放后的图像尺寸
        int scaledWidth = (int) (originalImage.getWidth() * scale);
        int scaledHeight = (int) (originalImage.getHeight() * scale);

        // 创建一个新的缩放后的图像
        BufferedImage scaledImage = new BufferedImage(scaledWidth, scaledHeight, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = scaledImage.createGraphics();

        // 使用高质量渲染设置
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);

        // 缩放原始图片并绘制到新图片上
        g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null);
        g.dispose();

        // 计算裁剪区域的 x 和 y 坐标（以保证裁剪区域位于中心）
        int x = (scaledWidth - targetWidth) / 2;
        int y = (scaledHeight - targetHeight) / 2;

        // 从缩放后的图像中裁剪出目标区域
        return scaledImage.getSubimage(x, y, targetWidth, targetHeight);
    }

}
